package co.gov.medellin.ssti.sub.model.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import co.gov.medellin.ssti.sub.model.dao.IGrupoFamiliarDAO;

public class GrupoFamiliarDAOImpl extends BaseDAOImpl implements
		IGrupoFamiliarDAO {
	private static final String SELECT_MAX_CODIGO = "SELECT MAX(codigo) max_codigo FROM TCS_BEN_GRUPO_FAMILIAR";
	private static final String INSERT = "INSERT INTO TCS_BEN_GRUPO_FAMILIAR "
			+ "(CODIGO, BEN_CODIGO,NOMBRE,CODIGO_USUARIO, "
			+ "usuario_crea,terminal_crea, fecha_crea,usuario_modifica,terminal_modifica,fecha_modifica) "
			+ "VALUES (SCS_BEN_GF.NextVal, ?,?,?,?,?,TO_DATE(?,'dd/mm/rrrr'),?,?,TO_DATE(?,'dd/mm/rrrr'))";
	private static final String INSERT_BEN_BENEF_GRUPO_FAMILIAR = "INSERT INTO TCS_BEN_BENEF_GRUPO_FAMILIAR "
			+ "(CODIGO, GF_CODIGO, BEN_CODIGO,VFL_CODIGO_PARENTESCO) "
			+ "VALUES (SCS_BEN_BGF.NextVal,?,?,?)";
	private static final String ASIGNAR_GRUPO_FAMILIAR_A_BENEFICIARIO = "INSERT INTO TCS_BEN_BENEF_GRUPO_FAMILIAR "
			+ "(CODIGO, GF_CODIGO, BEN_CODIGO,VFL_CODIGO_PARENTESCO, "
			+ "usuario_crea,terminal_crea, fecha_crea,usuario_modifica,terminal_modifica,fecha_modifica) "
			+ "VALUES (SCS_BEN_BGF.NextVal,?,?,?,?,?,TO_DATE(?,'dd/mm/rrrr'),?,?,TO_DATE(?,'dd/mm/rrrr'))";
	private static final String PREFIX_NOMBRE_GF = "GF-";

	public GrupoFamiliarDAOImpl(Connection con) {
		super(con);
	}

	public String[] insert(Long codeCabeza, String nombre, Long codeParentezco,
			String user, String terminal, String fecha) throws SQLException {
		PreparedStatement pstmt = null;

		String retorno[] = new String[2];
		int numRows = 0;
		try {
			pstmt = conn.prepareStatement(INSERT);
			pstmt.setLong(1, codeCabeza.longValue());
			pstmt.setString(2, PREFIX_NOMBRE_GF + nombre);
			pstmt.setString(3, PREFIX_NOMBRE_GF + nombre);
			pstmt.setString(4, user);
			pstmt.setString(5, terminal);
			pstmt.setString(6, fecha);
			pstmt.setString(7, user);
			pstmt.setString(8, terminal);
			pstmt.setString(9, fecha);

			// transaction start
			// con.setAutoCommit(false);
			numRows = pstmt.executeUpdate();
		} finally {
			close(pstmt);
		}
		if (numRows > 0) {
			Long code = null;
			code = findMaxCode();
			if (code != null) {
				retorno[1] = code.toString();
				try {
					pstmt = conn
							.prepareStatement(INSERT_BEN_BENEF_GRUPO_FAMILIAR);
					pstmt.setLong(1, code.longValue());
					pstmt.setLong(2, codeCabeza.longValue());
					pstmt.setLong(3, codeParentezco.longValue());
					numRows = pstmt.executeUpdate();
					if (numRows > 0) {
						retorno[0] = "true";
						// transaction end
						// con.commit();
					} else {
						retorno[0] = "false";
						// con.rollback();
					}
				} finally {
					close(pstmt);
				}
			}
		}
		return retorno;
	}

	public Long findMaxCode() throws SQLException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		Long maxCodigo = null;
		try {
			pstmt = conn.prepareStatement(SELECT_MAX_CODIGO);
			rst = pstmt.executeQuery();
			if (rst.next()) {
				maxCodigo = new Long(rst.getLong("max_codigo"));
			}
		} finally {
			close(rst, pstmt);
		}
		return maxCodigo;
	}

	public boolean asignarBeneficiarioAGrupoFamiliar(Long codeBeneficiario,
			Long codeGF, Long codeParentezco, String user, String terminal,
			String fecha) throws SQLException {
		PreparedStatement pstmt = null;

		try {
			pstmt = conn
					.prepareStatement(ASIGNAR_GRUPO_FAMILIAR_A_BENEFICIARIO);
			pstmt.setLong(1, codeGF.longValue());
			pstmt.setLong(2, codeBeneficiario.longValue());
			pstmt.setLong(3, codeParentezco.longValue());
			pstmt.setString(4, user);
			pstmt.setString(5, terminal);
			pstmt.setString(6, fecha);
			pstmt.setString(7, user);
			pstmt.setString(8, terminal);
			pstmt.setString(9, fecha);

			return (pstmt.executeUpdate() > 0 ? true : false);
		} finally {
			close(pstmt);
		}
	}

}
